#include "head.h"

int pipe_fd[2];//0读1写
void func(int num){
    write(pipe_fd[1],"123",3);

}
int main(){

    // 设置随机数种子  
    srand(time(NULL));  

    pipe(pipe_fd);
    if(fork()!=0){
        //父进程
        signal(2,func);

        wait(NULL);
        exit(0);
    }

    //子进程
    setpgid(0,0);

    //初始化结构体status
    status_t status;
    init_status(&status,4);

    //启动子进程
    init_thread(&status);

    //创建三次握手socket
    int socket_fd;
    init_socket(&socket_fd,"8080","192.168.163.128");

    int epoll_fd=epoll_create(1);

    //添加监听对象
    add_epoll(epoll_fd,socket_fd);

    //把管道的读端放入epoll监听
    add_epoll(epoll_fd,pipe_fd[0]);

    while(1){
        struct epoll_event event[2];
        memset(event,0,sizeof(event));

        int epoll_num=epoll_wait(epoll_fd,event,2,-1);
        
        for(int i=0;i<epoll_num;i++){
            int fd=event[i].data.fd;
            /* LOG_MSG(DEBUG,"fd?"); */
            if(fd==socket_fd){
                //有新连接进来
                int net_fd=accept(socket_fd,NULL,NULL);

                pthread_mutex_lock(&status.lock);
                enQueue(&status.queue,net_fd);
                pthread_cond_broadcast(&status.cond);

                pthread_mutex_unlock(&status.lock);
            }else if(fd==pipe_fd[0]){
                //此时说明管道可读，父进程写管道， 父进程收到信号才写管道
                 // 走到: 说明父进程收到了信号
                
                pthread_mutex_lock(&status.lock);
                
                status.exit_flag=1;
                pthread_cond_broadcast(&status.cond);//此时flag=1,要求子线程退出,需要唤醒处于阻塞的子线程
                pthread_mutex_unlock(&status.lock);
                 //主线程等待所以子线程退出
                 for(int i=0;i<4;i++){
                     pthread_join(status.thread_id[i],NULL);
                 }

                 //此时所有子线程全部退出,主线程退出
                 pthread_exit(NULL);
            }
        }
    } 
    return 0;
}

